nestedsvm: fix shadow-on-hap
authorChristoph Egger <Christoph.Egger@amd.com>
Thu, 12 May 2011 08:07:35 +0000 (09:07 +0100)
committerChristoph Egger <Christoph.Egger@amd.com>
Thu, 12 May 2011 08:07:35 +0000 (09:07 +0100)
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
Acked-by: Tim Deegan <Tim.Deegan@citrix.com>
xen/arch/x86/hvm/svm/entry.S
xen/arch/x86/hvm/svm/nestedsvm.c
xen/arch/x86/x86_32/asm-offsets.c
xen/arch/x86/x86_64/asm-offsets.c

index 9e124fc6aff84205fca42e6937ba298adbd19cb2..8ccb2e5dbb8b285f8f26182267040c67cad1cf87 100644 (file)
@@ -65,12 +65,16 @@ ENTRY(svm_asm_do_resume)
         testl $~0,(r(dx),r(ax),1)
         jnz  .Lsvm_process_softirqs
 
+        testb $0, VCPU_nsvm_hap_enabled(r(bx))
+        jz  .Lsvm_asid_handle
+        
         mov  VCPU_nhvm_p2m(r(bx)),r(ax)
         test r(ax),r(ax)
         sete %al
         andb VCPU_nhvm_guestmode(r(bx)),%al
         jnz  .Lsvm_nsvm_no_p2m
 
+.Lsvm_asid_handle:
         call svm_asid_handle_vmrun
 
         cmpb $0,addr_of(tb_init_done)
index bedbfbd3c8c1ac3af3e06970cb8b9dbe59883eac..8030a439100934d132c4f9a42a0d6edd65805915 100644 (file)
@@ -494,6 +494,7 @@ static int nsvm_vmcb_prepare4vmrun(struct vcpu *v, struct cpu_user_regs *regs)
         /* host nested paging + guest shadow paging. */
         n2vmcb->_np_enable = 1;
         /* Keep h_cr3 as it is. */
+        n2vmcb->_h_cr3 = n1vmcb->_h_cr3;
         /* When l1 guest does shadow paging
          * we assume it intercepts page faults.
          */
index 7bcbf513bd1dfe32e6a0f1668eae057e6a431285..934132e4ef52f595cee68c6db5cef95dd4c90153 100644 (file)
@@ -95,6 +95,7 @@ void __dummy__(void)
 
     OFFSET(VCPU_nhvm_guestmode, struct vcpu, arch.hvm_vcpu.nvcpu.nv_guestmode);
     OFFSET(VCPU_nhvm_p2m, struct vcpu, arch.hvm_vcpu.nvcpu.nv_p2m);
+    OFFSET(VCPU_nsvm_hap_enabled, struct vcpu, arch.hvm_vcpu.nvcpu.u.nsvm.ns_hap_enabled);
     BLANK();
 
     OFFSET(VMCB_rax, struct vmcb_struct, rax);
index a2c82d859d835e4e131c4f8fa107c06cba7ab94e..6108ea62bee7e1c61c32467622a3b6c015f0fe89 100644 (file)
@@ -117,6 +117,7 @@ void __dummy__(void)
 
     OFFSET(VCPU_nhvm_guestmode, struct vcpu, arch.hvm_vcpu.nvcpu.nv_guestmode);
     OFFSET(VCPU_nhvm_p2m, struct vcpu, arch.hvm_vcpu.nvcpu.nv_p2m);
+    OFFSET(VCPU_nsvm_hap_enabled, struct vcpu, arch.hvm_vcpu.nvcpu.u.nsvm.ns_hap_enabled);
     BLANK();
 
     OFFSET(DOMAIN_is_32bit_pv, struct domain, arch.is_32bit_pv);